// 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段，同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
// 输入：S = `"ababcbacadefegdehijhklij"`
// 输出：`[9,7,8]` 解释： 划分结果为 `"ababcbaca"`, `"defegde"`,`"hijhklij"`。 
// 每个字母最多出现在一个片段中。 像 `"ababcbacadefegde"`, `"hijhklij"` 的划分是错误的，因为划分的片段数较少。
// 思路，贪心
// 如果找到遍历过的所有字母的最远边界，则说明这个边界就是分割点了,此时前面出现过所有字母，最远也就到这个边界了。
function partitionLabels(s) {
    let map = {}
    // 每个元素的在字符串中右侧最远位置
    for (let i = 0; i < s.length; i++) {
        map[s[i]] = i        
    }
    let left = 0
    let right = 0
    let result = []
    for (let i = 0; i < s.length; i++) {
        // 更新每个元素的最远边界
        right = Math.max(right, map[s[i]])
        // 当正好最右边界，前面遍历的过的元素都在最远边界的左侧，所以没问题
        if (i === right) {
            result.push(right - left + 1)
            left = right + 1
        }        
    }
    return result
}

console.log(partitionLabels("ababcbacadefegdehijhklij"))